//
//  StatusDAL.swift
//  Weibo01
//
//  Created by 牛威 on 15/12/21.
//  Copyright © 2015年 牛威. All rights reserved.
//

import Foundation

//数据库缓存的最长时间 7天

private let maxTime :NSTimeInterval = 7 * 24 * 60 * 60


class StatusDAL {
    
    
    //MARK: - 清除数据缓存
    
    class func clearDataCache(){
    
    let date = NSDate(timeIntervalSinceNow: -maxTime)
    
    //转换日期格式
        
        let df = NSDateFormatter()
        
        df.locale = NSLocale(localeIdentifier: "en")
        
        df.dateFormat = "yyyy-MM-dd HH:mm:ss"
        
        let timeStr = df.stringFromDate(date)
        
        print(timeStr)
        
        //准备sql 提示 开发调式sql,一定要先写SELECT * ,等确定无误后,再替换为DELETE
        
        let sql = "DELETE FROM T_Status WHERE creatTime < ?;"
        
        
        //执行sql
        
        SQLiteManger.sharedManger.queue.inDatabase { (db) -> Void in
            
            if db.executeUpdate(sql, timeStr) {
            
              print("删除了\(db.changes())条数据")
            
            }
        }
    
    }
    
    
    
    class func loadStatus(since_id: Int, max_id: Int,finished:(array :[[String : AnyObject]]?)->()){
    
        //1 判断本地是否有网络缓存
    
       let array =   checkCacheExist(since_id, max_id: max_id)
    
    //2要是有,就直接缓存数据
    
    if array?.count > 0 {
    
      print("检测到缓存数据--\(array!.count)条记录")
        
        finished(array: nil)
        
        return
    
    }
        
        print("加载网络数据")

        //3要是没有就加载网络数据
    
    NetTools.shared.loadStatus(since_id: since_id, max_id: max_id) { (result, error) -> () in
        
        if error != nil {
            
            print("error")
            
            finished(array: nil)
            return
            
        }
        
        //遍历数组字典 [[String : AnyObject]]--->装着字典的数组格式
        
        guard let array = result?["statuses"] as? [[String : AnyObject]] else {
            
            
            print("数组格式有误")
            
            finished(array: nil)
            return
            
        }
        
        //4将网络加载数据,保存在本地缓存
        
        
        StatusDAL.saveCacheData(array)
        
        //5返回网络数据
        
        finished(array: array)
    }

    
}
    
    //MARK: - 检查本地缓存有无
    
  private  class  func checkCacheExist(since_id: Int, max_id: Int)->[[String : AnyObject]]? {
        
//        print(since_id,max_id)
        
        guard let userId = UserAccountViewModel.sharedAccount.account?.uid else {
            
            print("用户未登录")
            return nil
            
            
        }

        //1准备sql
        
        var sql = "SELECT statusId, status, userId FROM T_Status \n"
        
        sql += "WHERE userId = \(userId) \n"
        
        if since_id > 0 {    //下拉刷新
        
           sql += "AND statusId > \(since_id) \n"
        
        }else if(max_id > 0){ //上拉刷新
        
            sql += "AND statusId < \(max_id) \n"

        
        }
        
        sql += "ORDER  BY statusId DESC LIMIT 20; \n";
        
        //2执行sql
        
      let array = SQLiteManger.sharedManger.execRecordset(sql)!
        
        //遍历数组 取到数据
        
        var arrayM = [[String : AnyObject]]()
        
        for dict in array {
        
          //对数据进行反序列化
            
            let jsonData = dict["status"] as! NSData

            let data = try! NSJSONSerialization.JSONObjectWithData(jsonData, options: [])
            
            arrayM.append(data as! [String : AnyObject])
        }
 
        return arrayM
        
    }
    
    
    
    
    //MARK: - 保存网络数据到本地缓存--->  4将网络加载数据,保存在本地缓存
    
    
 private class  func saveCacheData(array : [[String : AnyObject]]){
    
    /**
      1 测试网络数据是否可以传过来
      2 根据SQL需求 确定参数
      3 如果SQL比较复杂 一定要提前测试
      4 调用数据库方法 要是插入数据的话 用事务更安全
      5 测试是否插入成功 刷新和发微博
    
       参数 微博id 通过字典获取
           微博 json 字典的序列化
           userId 通过用户的视图模型
    
    */
    
    
    
    guard let userId = UserAccountViewModel.sharedAccount.account?.uid else {
    
       print("用户未登录")
        return
    
    
    }
    
    let sql = "INSERT  OR  REPLACE INTO T_Status (statusId,status,userId) VALUES (?,?,?);"

    
    SQLiteManger.sharedManger.queue.inTransaction { (db, rollBack) -> Void in
        
        
        //遍历字典数组

        for dict in array{
            
            let statusId = dict["id"] as! Int
            
            //这里的数据是AFN传过来的,要是数据为空,就不会执行到这里,所以用强try!
            
            let json = try! NSJSONSerialization.dataWithJSONObject(dict, options: [])
            
            if  !db.executeUpdate(sql, statusId,json,userId){
            
               print("插入数据库失败")
                
                rollBack.memory = true
                
                break
            
            }
        }
    }
    
    print("插入成功")
}




}


